package com.raft.core.log.snapshot;

import java.io.InputStream;
import java.util.Set;

import javax.annotation.Nonnull;

import com.raft.core.node.NodeEndpoint;

/**日志快照是只读的，写入后不能修改
 * <br/>增加新配置的日志后，生成日志快照时也需要考虑新配置。由于集群配置和服务关系不大，因此日志快照的集群配置和数据快照相分离，作为日志快照的文件头中的数据存在
 * @author zhangsulei
 *
 */
public interface Snapshot {

    /**获取最后一条日志的索引
     * @return
     */
    int getLastIncludedIndex();

    /**获取最后一条日志的term
     * @return
     */
    int getLastIncludedTerm();

    /**获取集群配置
     * @return
     */
    @Nonnull
    Set<NodeEndpoint> getLastConfig();

    /**获取数据长度
     * @return
     */
    long getDataSize();

    /**读取指定位置和长度的数据
     * @param offset
     * @param length
     * @return
     */
    @Nonnull
    SnapshotChunk readData(int offset, int length);

    /**获取数据流
     * <br/>提供了一个不用读取全部数据的方式，在安装日志快照时，准确来说是在上层服务应用快照数据时使用，避免日志组件把数据快照的所有数据加载到内存
     * @return
     */
    @Nonnull
    InputStream getDataStream();

    /**关闭文件
     */
    void close();

}
